Adding official cell-type labels to Seurat objects based on cluster
labels.
Load libraries
library(Seurat)
library(dplyr)
Liver map
Read in liver map
sobj <- readRDS("~/Dropbox/Zoe/scf_version/analysis/healthy_sc/seurat_objects/dropletQC_filtered/allIntegrated_cca_kanchor5_noBiopsyHeps_dropletQCFiltered.RDS")
res <- "integrated_snn_res.1.4"
Idents(sobj) <- res
View UMAP
DimPlot(sobj, label = TRUE)

Grab cluster IDs and replace with cell-type names - Endothelial
cells: 0, 5, 8, 11, 30, 32, 33, 41, 42 - Lymphocytes: 1, 2, 4, 6, 7, 10,
12, 14, 24, 35 - CD3+ Tissue-resident memory T cells: 1, 2, 4, 7, 10,
12, 16 - CD3+ NK/T cells (XCL1;XCL2+): 6, 24, 39 - CD3+ Naive regulatory
T cells (LEF1+): 14 - CD3+ Proliferating T cells (TOP2A+): 35 - Myeloid
cells: 3, 9, 15, 17, 18, 22, 31, 37, 40, 43 - Macrophages (CD5L+): 3,
22, 43 - CD14+/CD16+ Monocytes (S100A8+): 9, 18 - CD14-/CD16+
Non-classical monocytes: 15, 17 - cDC1 conventional DC type 1 (CST3+):
31 - Hepatocytes: 13, 16, 19, 20, 21, 25, 28, 36 - Antibody-secreting B
cells: 23 - Mesenchymal: 26 - B cells: 27, 44 - Cholangiocytes: 34, 38 -
Doublets/contamination: 20, 29, 37, 40, 42
Visualise general cell-type markers
# Hepatocytes
FeaturePlot(sobj, features = c("ALB-1"))

FeaturePlot(sobj, features = c("CYP2E1","PCK1"))

# Endothelial
FeaturePlot(sobj, features = c("STAB2","CLEC4G"))

FeaturePlot(sobj, features = c("RSPO3","MECOM"))

# Lymphocytes
FeaturePlot(sobj, features = c("CD3E"))

FeaturePlot(sobj, features = c("XCL1;XCL2","LEF1"))

# B cells
FeaturePlot(sobj, features = c("CD79B", "MS4A1"))

# Plasma cells
FeaturePlot(sobj, features = c("JCHAIN"))

# Myeloid cells
FeaturePlot(sobj, features = c("LYZ-1","S100A8"))

FeaturePlot(sobj, features = c("CD5L","C1QB"))

FeaturePlot(sobj, features = c("CST3","FLT3"))

# Cholangiocytes
FeaturePlot(sobj, features = c("KRT19","SLC4A4"))

# Mast cells
FeaturePlot(sobj, features = c("Prss29"))

clusters <- as.character(Idents(sobj))
clusters <- gsub('\\b0\\b|\\b5\\b|\\b8\\b|\\b11\\b|\\b30\\b|\\b32\\b|\\b33\\b|\\b41\\b|\\b42\\b', "Endothelial",
clusters,
perl = TRUE)
clusters <- gsub('\\b1\\b|\\b2\\b|\\b4\\b|\\b7\\b|\\b10\\b|\\b12\\b|\\b16\\b',
"CD3+ Tissue-resident memory T cells",
clusters,
perl = TRUE)
clusters <- gsub('\\b6\\b|\\b24\\b|\\b39\\b',
"CD3+ NK/T cells",
clusters,
perl = TRUE)
clusters <- gsub('\\b3\\b|\\b22\\b|\\b43\\b', "Macrophages",
clusters,
perl = TRUE)
clusters <- gsub('\\b14\\b', "CD3+ Naive regulatory T cells",
clusters,
perl = TRUE)
clusters <- gsub('\\b35\\b', "CD3+ Proliferating T cells",
clusters,
perl = TRUE)
clusters <- gsub('\\b9\\b|\\b18\\b', "CD14+/CD16+ Monocytes",
clusters,
perl = TRUE)
clusters <- gsub('\\b15\\b|\\b17\\b', "CD14-/CD16+ Non-classical monocytes",
clusters,
perl = TRUE)
clusters <- gsub('\\b31\\b', "cDC1 conventional DC type 1",
clusters,
perl = TRUE)
clusters <- gsub('\\b13\\b|\\b16\\b|\\b19\\b|\\b20\\b|\\b21\\b|\\b25\\b|\\b28\\b|\\b36\\b', "Hepatocytes",
clusters,
perl = TRUE)
clusters <- gsub('\\b23\\b', "Antibody-secreting B cells",
clusters,
perl = TRUE)
clusters <- gsub('\\b26\\b', "Mesenchymal",
clusters,
perl = TRUE)
clusters <- gsub('\\b27\\b|\\b44\\b', "B cells",
clusters,
perl = TRUE)
clusters <- gsub('\\b34\\b|\\b38\\b', "Cholangiocytes",
clusters,
perl = TRUE)
clusters <- gsub('\\b20\\b|\\b29\\b|\\b37\\b|\\b40\\b|\\b42\\b', "Doublets/Contamination",
clusters,
perl = TRUE)
levels(as.factor(clusters))
[1] "Antibody-secreting B cells" "B cells"
[3] "CD14-/CD16+ Non-classical monocytes" "CD14+/CD16+ Monocytes"
[5] "CD3+ Naive regulatory T cells" "CD3+ NK/T cells"
[7] "CD3+ Proliferating T cells" "CD3+ Tissue-resident memory T cells"
[9] "cDC1 conventional DC type 1" "Cholangiocytes"
[11] "Doublets/Contamination" "Endothelial"
[13] "Hepatocytes" "Macrophages"
[15] "Mesenchymal"
Add as metadata and visualise on UMAP
sobj@meta.data$general_cell_labels <- clusters
DimPlot(sobj, group.by = "general_cell_labels", label = TRUE)

Save object with labels added
saveRDS(sobj,
file = "~/Dropbox/Zoe/scf_version/analysis/healthy_sc/seurat_objects/dropletQC_filtered/allIntegrated_cca_kanchor5_noBiopsyHeps_dropletQCFiltered.RDS")
Remove objects from environment
rm(list=ls())
gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 3906831 208.7 6285432 335.7 6285432 335.7
Vcells 7997258 61.1 1395876723 10649.7 1043869020 7964.1
PBMC map
Read in PBMC map
load("~/Dropbox/Zoe/scf_version/analysis/healthy_sc/seurat_objects/no_dropletQC/integrated_PBMC_cca_kanchor5_scClustViz.RData")
sobj <- scSeurat
res <- "integrated_snn_res.0.6"
Idents(sobj) <- res
View UMAP
DimPlot(sobj, label = TRUE)

Grab cluster IDs and replace with cell-type names - Monocytes: 0, 6,
8, 9, 21, 24 - CD14-/CD16+ Non-classical monocytes: 0, 21, 24 -
CD14-/CD16- Monocytes: 6, 9 - CD14+/CD16+ Monocytes: 8 - Monocytes 4
(PLAC8+/dendritic?): 14 - Lymphocytes: 1, 2, 4, 5, 7, 10, 13, 15, 17 -
CD3+ Mature resting memory T cells: 1, 5, 10, 17 - CD3+ NK/T cells
(XCL1;XCL2+): 4, 7 - CD3+ Naive regulatory T cells (LEF1+): 1, 10 - CD3+
Proliferating T cells (dividing): 23 - CD3+ TH2-like mature T cells
(GATA3+): 2,13 - CD3+ XXX: 15 - B-cells: 3, 11 - HSC: 16 - Plasma B: 18
- Megakaryocytes: 19 - Mast cell: 22 - Erythrocytes: 12 - Unknown:
20
Visualise general cell-type markers:
# Lymphocytes
FeaturePlot(sobj, features = c("CD3E","STMN1"))

FeaturePlot(sobj, features = c("XCL1;XCL2","LEF1"))

FeaturePlot(sobj, features = c("NKG7","CD5"))

FeaturePlot(sobj, features = c("CD247","RHEX"))

# B cells
FeaturePlot(sobj, features = c("BANK1", "MS4A1"))

# Plasma cells
FeaturePlot(sobj, features = c("JCHAIN"))

# Myeloid cells
FeaturePlot(sobj, features = c("S100A8"))

FeaturePlot(sobj, features = c("CD14","FCGR3A;FCGR3B"))

FeaturePlot(sobj, features = c("Fcgr3;Fcgr2b","FLT3"))

FeaturePlot(sobj, features = c("CST3","FLT3"))

# Megakaryocytes
FeaturePlot(sobj, features = c("GP9","TREML1"))

# Mast cells
FeaturePlot(sobj, features = c("Prss29","Prss34"))

# Erythrocytes
FeaturePlot(sobj, features = c("HBA2;HBA1"))

clusters <- as.character(Idents(sobj))
clusters <- gsub('\\b3\\b|\\b11\\b', "B cells",
clusters,
perl = TRUE)
clusters <- gsub('\\b1\\b|\\b10\\b', "Lymphocytes 3",
clusters,
perl = TRUE)
clusters <- gsub('\\b2\\b|\\b5\\b|\\b13\\b|\\b17\\b', "Lymphocytes 1",
clusters,
perl = TRUE)
clusters <- gsub('\\b4\\b|\\b7\\b', "Lymphocytes 2",
clusters,
perl = TRUE)
clusters <- gsub('\\b0\\b|\\b21\\b|\\b24\\b', "Monocytes 1",
clusters,
perl = TRUE)
clusters <- gsub('\\b23\\b', "Lymphocytes 4",
clusters,
perl = TRUE)
clusters <- gsub('\\b15\\b', "Lymphocytes 5",
clusters,
perl = TRUE)
clusters <- gsub('\\b6\\b|\\b9\\b', "Monocytes 2",
clusters,
perl = TRUE)
clusters <- gsub('\\b8\\b', "Monocytes 3",
clusters,
perl = TRUE)
clusters <- gsub('\\b14\\b', "Monocytes 4",
clusters,
perl = TRUE)
clusters <- gsub('\\b18\\b', "Plasma B cells",
clusters,
perl = TRUE)
clusters <- gsub('\\b16\\b', "Hematopoietic stem cells",
clusters,
perl = TRUE)
clusters <- gsub('\\b19\\b', "Megakaryocytes",
clusters,
perl = TRUE)
clusters <- gsub('\\b22\\b', "Mast cells",
clusters,
perl = TRUE)
clusters <- gsub('\\b12\\b', "Erythrocytes",
clusters,
perl = TRUE)
clusters <- gsub('\\b20\\b', "Unknown",
clusters,
perl = TRUE)
levels(as.factor(clusters))
[1] "B cells" "Erythrocytes" "Hematopoietic stem cells"
[4] "Lymphocytes 1" "Lymphocytes 2" "Lymphocytes 3"
[7] "Lymphocytes 4" "Lymphocytes 5" "Mast cells"
[10] "Megakaryocytes" "Monocytes 1" "Monocytes 2"
[13] "Monocytes 3" "Monocytes 4" "Plasma B cells"
[16] "Unknown"
Add as metadata and visualise on UMAP
sobj@meta.data$general_cell_labels <- clusters
DimPlot(sobj, group.by = "general_cell_labels", label = TRUE)

Save object with labels added
scSeurat <- sobj
save(sCVdata_list, scSeurat,
file = "~/Dropbox/Zoe/scf_version/analysis/healthy_sc/seurat_objects/no_dropletQC/integrated_PBMC_cca_kanchor5_scClustViz.RData")
Stimulated data
Read in stimulated data
load("~/Dropbox/Zoe/scf_version/analysis/healthy_sc/seurat_objects/no_dropletQC/3391/integrated_3391_stimulation_pmaio_unstim_downsampled_cca_kanchor5_scClustViz.RData")
# Set identity
Idents(scSeurat) <- "integrated_snn_res.0.4"
View UMAP
DimPlot(scSeurat, label = TRUE)

Grab cluster IDs and replace with cell-type names - Endothelial
cells: 0, 3, 10 - Mesenchymal cells: 8, 9 - Hepatocytes: 4, 5, 12 - T
cells: 2, 6 - Lymphocytes: 1 - Plasma cells: 11 Clusters 0, 4, 8, 10
have odd gene expression
Visualise general cell-type markers
# Hepatocytes
FeaturePlot(scSeurat, features = c("ALB-1"))

FeaturePlot(scSeurat, features = c("CYP2E1","PCK1"))

# Endothelial
FeaturePlot(scSeurat, features = c("STAB2","CLEC4G"))

FeaturePlot(scSeurat, features = c("RSPO3","MECOM"))

# Lymphocytes
FeaturePlot(scSeurat, features = c("CD3E"))

FeaturePlot(scSeurat, features = c("XCL1;XCL2","LEF1"))

# B cells
FeaturePlot(scSeurat, features = c("CD79B", "MS4A1"))

# Plasma cells
FeaturePlot(scSeurat, features = c("JCHAIN"))

# Myeloid cells
FeaturePlot(scSeurat, features = c("LYZ-1","S100A8"))

FeaturePlot(scSeurat, features = c("CD5L","C1QB"))

FeaturePlot(scSeurat, features = c("CST3","FLT3"))

# Cholangiocytes
FeaturePlot(scSeurat, features = c("KRT19","SLC4A4"))

# Mesenchymal
FeaturePlot(scSeurat, features = c("HHIP"))

clusters <- as.character(Idents(scSeurat))
clusters <- gsub('\\b0\\b|\\b3\\b|\\b10\\b', "Endothelial",
clusters,
perl = TRUE)
clusters <- gsub('\\b1\\b', "Myeloid",
clusters,
perl = TRUE)
clusters <- gsub('\\b2\\b|\\b6\\b', "Lymphocytes",
clusters,
perl = TRUE)
clusters <- gsub('\\b11\\b', "Antibody-secreting B cells",
clusters,
perl = TRUE)
clusters <- gsub('\\b4\\b|\\b5\\b|\\b12\\b', "Hepatocytes",
clusters,
perl = TRUE)
clusters <- gsub('\\b8\\b|\\b9\\b', "Mesenchymal",
clusters,
perl = TRUE)
clusters <- gsub('\\b7\\b|\\b13\\b', "Cholangiocytes",
clusters,
perl = TRUE)
levels(as.factor(clusters))
[1] "Antibody-secreting B cells" "Cholangiocytes" "Endothelial"
[4] "Hepatocytes" "Lymphocytes" "Mesenchymal"
[7] "Myeloid"
Add as metadata and visualise on UMAP
scSeurat@meta.data$general_cell_labels <- clusters
DimPlot(scSeurat, group.by = "general_cell_labels", label = TRUE)

Save object with labels added
save(sCVdata_list, scSeurat,
file = "~/Dropbox/Zoe/scf_version/analysis/healthy_sc/seurat_objects/no_dropletQC/3391/integrated_3391_stimulation_pmaio_unstim_downsampled_cca_kanchor5_scClustViz.RData")
Now add new labels but keep cluster numbers
clusters <- as.character(Idents(scSeurat))
clusters <- gsub('\\b0\\b', "Endothelial (0)", clusters, perl = TRUE)
clusters <- gsub('\\b3\\b', "Endothelial (3)", clusters, perl = TRUE)
clusters <- gsub('\\b11\\b', "Antibody-secreting B cells (11)",
clusters,
perl = TRUE)
clusters <- gsub('\\b12\\b', "Hepatocytes (12)", clusters, perl = TRUE)
clusters <- gsub('\\b13\\b', "Cholangiocytes (13)", clusters, perl = TRUE)
clusters <- gsub('\\b10\\b', "Endothelial (10)", clusters, perl = TRUE)
clusters <- gsub('\\b1\\b', "Myeloid (1)", clusters, perl = TRUE)
clusters <- gsub('\\b2\\b', "CD3+ NK/T cells (2)", clusters, perl = TRUE)
clusters <- gsub('\\b6\\b', "CD3+ NK/T cells (6)", clusters, perl = TRUE)
clusters <- gsub('\\b4\\b', "Hepatocytes (4)", clusters, perl = TRUE)
clusters <- gsub('\\b5\\b', "Hepatocytes (5)", clusters, perl = TRUE)
clusters <- gsub('\\b8\\b', "Mesenchymal (8)", clusters, perl = TRUE)
clusters <- gsub('\\b9\\b', "Mesenchymal (9)", clusters, perl = TRUE)
clusters <- gsub('\\b7\\b', "Cholangiocytes (7)", clusters, perl = TRUE)
levels(as.factor(clusters))
[1] "Antibody-secreting B cells (11)" "CD3+ NK/T cells (2)"
[3] "CD3+ NK/T cells (6)" "Cholangiocytes (13)"
[5] "Cholangiocytes (7)" "Endothelial (0)"
[7] "Endothelial (10)" "Endothelial (3)"
[9] "Hepatocytes (12)" "Hepatocytes (4)"
[11] "Hepatocytes (5)" "Mesenchymal (8)"
[13] "Mesenchymal (9)" "Myeloid (1)"
Add as metadata and visualise on UMAP
scSeurat@meta.data$general_cell_labels_clusts <- clusters
DimPlot(scSeurat, group.by = "general_cell_labels_clusts", label = TRUE)

Save object with labels added
save(sCVdata_list, scSeurat,
file = "~/Dropbox/Zoe/scf_version/analysis/healthy_sc/seurat_objects/no_dropletQC/3391/integrated_3391_stimulation_pmaio_unstim_downsampled_cca_kanchor5_scClustViz.RData")
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKQWRkaW5nIG9mZmljaWFsIGNlbGwtdHlwZSBsYWJlbHMgdG8gU2V1cmF0IG9iamVjdHMgYmFzZWQgb24gY2x1c3RlciBsYWJlbHMuCgpMb2FkIGxpYnJhcmllcwoKYGBge3J9CmxpYnJhcnkoU2V1cmF0KQpsaWJyYXJ5KGRwbHlyKQpgYGAKCiMjIExpdmVyIG1hcAoKUmVhZCBpbiBsaXZlciBtYXAKCmBgYHtyfQpzb2JqIDwtIHJlYWRSRFMoIn4vRHJvcGJveC9ab2Uvc2NmX3ZlcnNpb24vYW5hbHlzaXMvaGVhbHRoeV9zYy9zZXVyYXRfb2JqZWN0cy9kcm9wbGV0UUNfZmlsdGVyZWQvYWxsSW50ZWdyYXRlZF9jY2Ffa2FuY2hvcjVfbm9CaW9wc3lIZXBzX2Ryb3BsZXRRQ0ZpbHRlcmVkLlJEUyIpCnJlcyA8LSAiaW50ZWdyYXRlZF9zbm5fcmVzLjEuNCIKSWRlbnRzKHNvYmopIDwtIHJlcwpgYGAKClZpZXcgVU1BUAoKYGBge3J9CkRpbVBsb3Qoc29iaiwgbGFiZWwgPSBUUlVFKQpgYGAKCkdyYWIgY2x1c3RlciBJRHMgYW5kIHJlcGxhY2Ugd2l0aCBjZWxsLXR5cGUgbmFtZXMKLSBFbmRvdGhlbGlhbCBjZWxsczogMCwgNSwgOCwgMTEsIDMwLCAzMiwgMzMsIDQxLCA0MgotIEx5bXBob2N5dGVzOiAxLCAyLCA0LCA2LCA3LCAxMCwgMTIsIDE0LCAyNCwgMzUKLSBDRDMrIFRpc3N1ZS1yZXNpZGVudCBtZW1vcnkgVCBjZWxsczogMSwgMiwgNCwgNywgMTAsIDEyLCAxNgotIENEMysgTksvVCBjZWxscyAoWENMMTtYQ0wyKyk6IDYsIDI0LCAzOQotIENEMysgTmFpdmUgcmVndWxhdG9yeSBUIGNlbGxzIChMRUYxKyk6IDE0Ci0gQ0QzKyBQcm9saWZlcmF0aW5nIFQgY2VsbHMgKFRPUDJBKyk6IDM1Ci0gTXllbG9pZCBjZWxsczogMywgOSwgMTUsIDE3LCAxOCwgMjIsIDMxLCAzNywgNDAsIDQzCi0gTWFjcm9waGFnZXMgKENENUwrKTogMywgMjIsIDQzCi0gQ0QxNCsvQ0QxNisgTW9ub2N5dGVzIChTMTAwQTgrKTogOSwgMTgKLSBDRDE0LS9DRDE2KyBOb24tY2xhc3NpY2FsIG1vbm9jeXRlczogMTUsIDE3Ci0gY0RDMSBjb252ZW50aW9uYWwgREMgdHlwZSAxIChDU1QzKyk6IDMxCi0gSGVwYXRvY3l0ZXM6IDEzLCAxNiwgMTksIDIwLCAyMSwgMjUsIDI4LCAzNgotIEFudGlib2R5LXNlY3JldGluZyBCIGNlbGxzOiAyMwotIE1lc2VuY2h5bWFsOiAyNgotIEIgY2VsbHM6IDI3LCA0NAotIENob2xhbmdpb2N5dGVzOiAzNCwgMzgKLSBEb3VibGV0cy9jb250YW1pbmF0aW9uOiAyMCwgMjksIDM3LCA0MCwgNDIKClZpc3VhbGlzZSBnZW5lcmFsIGNlbGwtdHlwZSBtYXJrZXJzCgpgYGB7cn0KIyBIZXBhdG9jeXRlcwpGZWF0dXJlUGxvdChzb2JqLCBmZWF0dXJlcyA9IGMoIkFMQi0xIikpCkZlYXR1cmVQbG90KHNvYmosIGZlYXR1cmVzID0gYygiQ1lQMkUxIiwiUENLMSIpKQojIEVuZG90aGVsaWFsCkZlYXR1cmVQbG90KHNvYmosIGZlYXR1cmVzID0gYygiU1RBQjIiLCJDTEVDNEciKSkKRmVhdHVyZVBsb3Qoc29iaiwgZmVhdHVyZXMgPSBjKCJSU1BPMyIsIk1FQ09NIikpCiMgTHltcGhvY3l0ZXMKRmVhdHVyZVBsb3Qoc29iaiwgZmVhdHVyZXMgPSBjKCJDRDNFIikpCkZlYXR1cmVQbG90KHNvYmosIGZlYXR1cmVzID0gYygiWENMMTtYQ0wyIiwiTEVGMSIpKQojIEIgY2VsbHMKRmVhdHVyZVBsb3Qoc29iaiwgZmVhdHVyZXMgPSBjKCJDRDc5QiIsICJNUzRBMSIpKQojIFBsYXNtYSBjZWxscwpGZWF0dXJlUGxvdChzb2JqLCBmZWF0dXJlcyA9IGMoIkpDSEFJTiIpKQojIE15ZWxvaWQgY2VsbHMKRmVhdHVyZVBsb3Qoc29iaiwgZmVhdHVyZXMgPSBjKCJMWVotMSIsIlMxMDBBOCIpKQpGZWF0dXJlUGxvdChzb2JqLCBmZWF0dXJlcyA9IGMoIkNENUwiLCJDMVFCIikpCkZlYXR1cmVQbG90KHNvYmosIGZlYXR1cmVzID0gYygiQ1NUMyIsIkZMVDMiKSkKIyBDaG9sYW5naW9jeXRlcwpGZWF0dXJlUGxvdChzb2JqLCBmZWF0dXJlcyA9IGMoIktSVDE5IiwiU0xDNEE0IikpCiMgTWFzdCBjZWxscwpGZWF0dXJlUGxvdChzb2JqLCBmZWF0dXJlcyA9IGMoIlByc3MyOSIpKQpgYGAKCgpgYGB7cn0KY2x1c3RlcnMgPC0gYXMuY2hhcmFjdGVyKElkZW50cyhzb2JqKSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiMFxcYnxcXGI1XFxifFxcYjhcXGJ8XFxiMTFcXGJ8XFxiMzBcXGJ8XFxiMzJcXGJ8XFxiMzNcXGJ8XFxiNDFcXGJ8XFxiNDJcXGInLCAiRW5kb3RoZWxpYWwiLAogICAgICAgICAgICAgICAgIGNsdXN0ZXJzLAogICAgICAgICAgICAgICAgIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGIxXFxifFxcYjJcXGJ8XFxiNFxcYnxcXGI3XFxifFxcYjEwXFxifFxcYjEyXFxifFxcYjE2XFxiJywgCiAgICAgICAgICAgICAgICAgIkNEMysgVGlzc3VlLXJlc2lkZW50IG1lbW9yeSBUIGNlbGxzIiwKICAgICAgICAgICAgICAgICBjbHVzdGVycywKICAgICAgICAgICAgICAgICBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiNlxcYnxcXGIyNFxcYnxcXGIzOVxcYicsIAogICAgICAgICAgICAgICAgICJDRDMrIE5LL1QgY2VsbHMiLAogICAgICAgICAgICAgICAgIGNsdXN0ZXJzLAogICAgICAgICAgICAgICAgIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGIzXFxifFxcYjIyXFxifFxcYjQzXFxiJywgIk1hY3JvcGhhZ2VzIiwKICAgICAgICAgICAgICAgICBjbHVzdGVycywKICAgICAgICAgICAgICAgICBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiMTRcXGInLCAiQ0QzKyBOYWl2ZSByZWd1bGF0b3J5IFQgY2VsbHMiLAogICAgICAgICAgICAgICAgIGNsdXN0ZXJzLAogICAgICAgICAgICAgICAgIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGIzNVxcYicsICJDRDMrIFByb2xpZmVyYXRpbmcgVCBjZWxscyIsCiAgICAgICAgICAgICAgICAgY2x1c3RlcnMsCiAgICAgICAgICAgICAgICAgcGVybCA9IFRSVUUpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjlcXGJ8XFxiMThcXGInLCAiQ0QxNCsvQ0QxNisgTW9ub2N5dGVzIiwKICAgICAgICAgICAgICAgICBjbHVzdGVycywKICAgICAgICAgICAgICAgICBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiMTVcXGJ8XFxiMTdcXGInLCAiQ0QxNC0vQ0QxNisgTm9uLWNsYXNzaWNhbCBtb25vY3l0ZXMiLAogICAgICAgICAgICAgICAgIGNsdXN0ZXJzLAogICAgICAgICAgICAgICAgIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGIzMVxcYicsICJjREMxIGNvbnZlbnRpb25hbCBEQyB0eXBlIDEiLAogICAgICAgICAgICAgICAgIGNsdXN0ZXJzLAogICAgICAgICAgICAgICAgIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGIxM1xcYnxcXGIxNlxcYnxcXGIxOVxcYnxcXGIyMFxcYnxcXGIyMVxcYnxcXGIyNVxcYnxcXGIyOFxcYnxcXGIzNlxcYicsICJIZXBhdG9jeXRlcyIsCiAgICAgICAgICAgICAgICAgY2x1c3RlcnMsCiAgICAgICAgICAgICAgICAgcGVybCA9IFRSVUUpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjIzXFxiJywgIkFudGlib2R5LXNlY3JldGluZyBCIGNlbGxzIiwKICAgICAgICAgICAgICAgICBjbHVzdGVycywKICAgICAgICAgICAgICAgICBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiMjZcXGInLCAiTWVzZW5jaHltYWwiLAogICAgICAgICAgICAgICAgIGNsdXN0ZXJzLAogICAgICAgICAgICAgICAgIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGIyN1xcYnxcXGI0NFxcYicsICJCIGNlbGxzIiwKICAgICAgICAgICAgICAgICBjbHVzdGVycywKICAgICAgICAgICAgICAgICBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiMzRcXGJ8XFxiMzhcXGInLCAiQ2hvbGFuZ2lvY3l0ZXMiLAogICAgICAgICAgICAgICAgIGNsdXN0ZXJzLAogICAgICAgICAgICAgICAgIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGIyMFxcYnxcXGIyOVxcYnxcXGIzN1xcYnxcXGI0MFxcYnxcXGI0MlxcYicsICJEb3VibGV0cy9Db250YW1pbmF0aW9uIiwKICAgICAgICAgICAgICAgICBjbHVzdGVycywKICAgICAgICAgICAgICAgICBwZXJsID0gVFJVRSkKbGV2ZWxzKGFzLmZhY3RvcihjbHVzdGVycykpCmBgYAoKQWRkIGFzIG1ldGFkYXRhIGFuZCB2aXN1YWxpc2Ugb24gVU1BUAoKYGBge3J9CnNvYmpAbWV0YS5kYXRhJGdlbmVyYWxfY2VsbF9sYWJlbHMgPC0gY2x1c3RlcnMKRGltUGxvdChzb2JqLCBncm91cC5ieSA9ICJnZW5lcmFsX2NlbGxfbGFiZWxzIiwgbGFiZWwgPSBUUlVFKQpgYGAKClNhdmUgb2JqZWN0IHdpdGggbGFiZWxzIGFkZGVkCgpgYGB7cn0Kc2F2ZVJEUyhzb2JqLAogICAgICAgIGZpbGUgPSAifi9Ecm9wYm94L1pvZS9zY2ZfdmVyc2lvbi9hbmFseXNpcy9oZWFsdGh5X3NjL3NldXJhdF9vYmplY3RzL2Ryb3BsZXRRQ19maWx0ZXJlZC9hbGxJbnRlZ3JhdGVkX2NjYV9rYW5jaG9yNV9ub0Jpb3BzeUhlcHNfZHJvcGxldFFDRmlsdGVyZWQuUkRTIikKYGBgCgpSZW1vdmUgb2JqZWN0cyBmcm9tIGVudmlyb25tZW50CgpgYGB7cn0Kcm0obGlzdD1scygpKQpnYygpCmBgYAoKCiMjIFBCTUMgbWFwCgpSZWFkIGluIFBCTUMgbWFwCgpgYGB7cn0KbG9hZCgifi9Ecm9wYm94L1pvZS9zY2ZfdmVyc2lvbi9hbmFseXNpcy9oZWFsdGh5X3NjL3NldXJhdF9vYmplY3RzL25vX2Ryb3BsZXRRQy9pbnRlZ3JhdGVkX1BCTUNfY2NhX2thbmNob3I1X3NjQ2x1c3RWaXouUkRhdGEiKQpzb2JqIDwtIHNjU2V1cmF0CnJlcyA8LSAiaW50ZWdyYXRlZF9zbm5fcmVzLjAuNiIKSWRlbnRzKHNvYmopIDwtIHJlcwpgYGAKClZpZXcgVU1BUAoKYGBge3J9CkRpbVBsb3Qoc29iaiwgbGFiZWwgPSBUUlVFKQpgYGAKCkdyYWIgY2x1c3RlciBJRHMgYW5kIHJlcGxhY2Ugd2l0aCBjZWxsLXR5cGUgbmFtZXMKLSBNb25vY3l0ZXM6IDAsIDYsIDgsIDksIDIxLCAyNAotIENEMTQtL0NEMTYrIE5vbi1jbGFzc2ljYWwgbW9ub2N5dGVzOiAwLCAyMSwgMjQKLSBDRDE0LS9DRDE2LSBNb25vY3l0ZXM6IDYsIDkKLSBDRDE0Ky9DRDE2KyBNb25vY3l0ZXM6IDgKLSBNb25vY3l0ZXMgNCAoUExBQzgrL2RlbmRyaXRpYz8pOiAxNCAKLSBMeW1waG9jeXRlczogMSwgMiwgNCwgNSwgNywgMTAsIDEzLCAxNSwgMTcKLSBDRDMrIE1hdHVyZSByZXN0aW5nIG1lbW9yeSBUIGNlbGxzOiAxLCA1LCAxMCwgMTcKLSBDRDMrIE5LL1QgY2VsbHMgKFhDTDE7WENMMispOiA0LCA3Ci0gQ0QzKyBOYWl2ZSByZWd1bGF0b3J5IFQgY2VsbHMgKExFRjErKTogMSwgMTAKLSBDRDMrIFByb2xpZmVyYXRpbmcgVCBjZWxscyAoZGl2aWRpbmcpOiAyMwotIENEMysgVEgyLWxpa2UgbWF0dXJlIFQgY2VsbHMgKEdBVEEzKyk6IDIsMTMKLSBDRDMrIFhYWDogMTUKLSBCLWNlbGxzOiAzLCAxMQotIEhTQzogMTYKLSBQbGFzbWEgQjogMTgKLSBNZWdha2FyeW9jeXRlczogMTkKLSBNYXN0IGNlbGw6IDIyCi0gRXJ5dGhyb2N5dGVzOiAxMgotIFVua25vd246IDIwCgpWaXN1YWxpc2UgZ2VuZXJhbCBjZWxsLXR5cGUgbWFya2VyczoKCmBgYHtyfQojIEx5bXBob2N5dGVzCkZlYXR1cmVQbG90KHNvYmosIGZlYXR1cmVzID0gYygiQ0QzRSIsIlNUTU4xIikpCkZlYXR1cmVQbG90KHNvYmosIGZlYXR1cmVzID0gYygiWENMMTtYQ0wyIiwiTEVGMSIpKQpGZWF0dXJlUGxvdChzb2JqLCBmZWF0dXJlcyA9IGMoIk5LRzciLCJDRDUiKSkKRmVhdHVyZVBsb3Qoc29iaiwgZmVhdHVyZXMgPSBjKCJDRDI0NyIsIlJIRVgiKSkKIyBCIGNlbGxzCkZlYXR1cmVQbG90KHNvYmosIGZlYXR1cmVzID0gYygiQkFOSzEiLCAiTVM0QTEiKSkKIyBQbGFzbWEgY2VsbHMKRmVhdHVyZVBsb3Qoc29iaiwgZmVhdHVyZXMgPSBjKCJKQ0hBSU4iKSkKIyBNeWVsb2lkIGNlbGxzCkZlYXR1cmVQbG90KHNvYmosIGZlYXR1cmVzID0gYygiUzEwMEE4IikpCkZlYXR1cmVQbG90KHNvYmosIGZlYXR1cmVzID0gYygiQ0QxNCIsIkZDR1IzQTtGQ0dSM0IiKSkKRmVhdHVyZVBsb3Qoc29iaiwgZmVhdHVyZXMgPSBjKCJGY2dyMztGY2dyMmIiLCJGTFQzIikpCkZlYXR1cmVQbG90KHNvYmosIGZlYXR1cmVzID0gYygiQ1NUMyIsIkZMVDMiKSkKIyBNZWdha2FyeW9jeXRlcwpGZWF0dXJlUGxvdChzb2JqLCBmZWF0dXJlcyA9IGMoIkdQOSIsIlRSRU1MMSIpKQojIE1hc3QgY2VsbHMKRmVhdHVyZVBsb3Qoc29iaiwgZmVhdHVyZXMgPSBjKCJQcnNzMjkiLCJQcnNzMzQiKSkKIyBFcnl0aHJvY3l0ZXMKRmVhdHVyZVBsb3Qoc29iaiwgZmVhdHVyZXMgPSBjKCJIQkEyO0hCQTEiKSkKYGBgCgoKYGBge3J9CmNsdXN0ZXJzIDwtIGFzLmNoYXJhY3RlcihJZGVudHMoc29iaikpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjNcXGJ8XFxiMTFcXGInLCAiQiBjZWxscyIsCiAgICAgICAgICAgICAgICAgY2x1c3RlcnMsCiAgICAgICAgICAgICAgICAgcGVybCA9IFRSVUUpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjFcXGJ8XFxiMTBcXGInLCAiQ0QzKyBOYWl2ZSByZWd1bGF0b3J5IFQgY2VsbHMiLAogICAgICAgICAgICAgICAgIGNsdXN0ZXJzLAogICAgICAgICAgICAgICAgIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGIyXFxifFxcYjVcXGJ8XFxiMTNcXGJ8XFxiMTdcXGInLCAiTHltcGhvY3l0ZXMgMSIsCiAgICAgICAgICAgICAgICAgY2x1c3RlcnMsCiAgICAgICAgICAgICAgICAgcGVybCA9IFRSVUUpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjRcXGJ8XFxiN1xcYicsICJDRDMrIE5LL1QgY2VsbHMiLAogICAgICAgICAgICAgICAgIGNsdXN0ZXJzLAogICAgICAgICAgICAgICAgIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGIwXFxifFxcYjIxXFxifFxcYjI0XFxiJywgIkNEMTQtL0NEMTYrIE5vbi1jbGFzc2ljYWwgbW9ub2N5dGVzIiwKICAgICAgICAgICAgICAgICBjbHVzdGVycywKICAgICAgICAgICAgICAgICBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiMjNcXGInLCAiQ0QzKyBQcm9saWZlcmF0aW5nIFQgY2VsbHMiLAogICAgICAgICAgICAgICAgIGNsdXN0ZXJzLAogICAgICAgICAgICAgICAgIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGIxNVxcYicsICJMeW1waG9jeXRlcyA1IiwKICAgICAgICAgICAgICAgICBjbHVzdGVycywKICAgICAgICAgICAgICAgICBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiNlxcYnxcXGI5XFxiJywgIkNEMTQtL0NEMTYtIE1vbm9jeXRlcyIsCiAgICAgICAgICAgICAgICAgY2x1c3RlcnMsCiAgICAgICAgICAgICAgICAgcGVybCA9IFRSVUUpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjhcXGInLCAiQ0QxNCsvQ0QxNisgTW9ub2N5dGVzIiwKICAgICAgICAgICAgICAgICBjbHVzdGVycywKICAgICAgICAgICAgICAgICBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiMTRcXGInLCAiTW9ub2N5dGVzIDQiLAogICAgICAgICAgICAgICAgIGNsdXN0ZXJzLAogICAgICAgICAgICAgICAgIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGIxOFxcYicsICJQbGFzbWEgQiBjZWxscyIsCiAgICAgICAgICAgICAgICAgY2x1c3RlcnMsCiAgICAgICAgICAgICAgICAgcGVybCA9IFRSVUUpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjE2XFxiJywgIkhlbWF0b3BvaWV0aWMgc3RlbSBjZWxscyIsCiAgICAgICAgICAgICAgICAgY2x1c3RlcnMsCiAgICAgICAgICAgICAgICAgcGVybCA9IFRSVUUpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjE5XFxiJywgIk1lZ2FrYXJ5b2N5dGVzIiwKICAgICAgICAgICAgICAgICBjbHVzdGVycywKICAgICAgICAgICAgICAgICBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiMjJcXGInLCAiTWFzdCBjZWxscyIsCiAgICAgICAgICAgICAgICAgY2x1c3RlcnMsCiAgICAgICAgICAgICAgICAgcGVybCA9IFRSVUUpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjEyXFxiJywgIkVyeXRocm9jeXRlcyIsCiAgICAgICAgICAgICAgICAgY2x1c3RlcnMsCiAgICAgICAgICAgICAgICAgcGVybCA9IFRSVUUpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjIwXFxiJywgIlVua25vd24iLAogICAgICAgICAgICAgICAgIGNsdXN0ZXJzLAogICAgICAgICAgICAgICAgIHBlcmwgPSBUUlVFKQpsZXZlbHMoYXMuZmFjdG9yKGNsdXN0ZXJzKSkKYGBgCgpBZGQgYXMgbWV0YWRhdGEgYW5kIHZpc3VhbGlzZSBvbiBVTUFQCgpgYGB7cn0Kc29iakBtZXRhLmRhdGEkZ2VuZXJhbF9jZWxsX2xhYmVscyA8LSBjbHVzdGVycwpEaW1QbG90KHNvYmosIGdyb3VwLmJ5ID0gImdlbmVyYWxfY2VsbF9sYWJlbHMiLCBsYWJlbCA9IFRSVUUpCmBgYAoKU2F2ZSBvYmplY3Qgd2l0aCBsYWJlbHMgYWRkZWQKCmBgYHtyfQpzY1NldXJhdCA8LSBzb2JqCnNhdmUoc0NWZGF0YV9saXN0LCBzY1NldXJhdCwKICAgICBmaWxlID0gIn4vRHJvcGJveC9ab2Uvc2NmX3ZlcnNpb24vYW5hbHlzaXMvaGVhbHRoeV9zYy9zZXVyYXRfb2JqZWN0cy9ub19kcm9wbGV0UUMvaW50ZWdyYXRlZF9QQk1DX2NjYV9rYW5jaG9yNV9zY0NsdXN0Vml6LlJEYXRhIikKYGBgCgojIyBTdGltdWxhdGVkIGRhdGEKClJlYWQgaW4gc3RpbXVsYXRlZCBkYXRhCgpgYGB7cn0KbG9hZCgifi9Ecm9wYm94L1pvZS9zY2ZfdmVyc2lvbi9hbmFseXNpcy9oZWFsdGh5X3NjL3NldXJhdF9vYmplY3RzL25vX2Ryb3BsZXRRQy8zMzkxL2ludGVncmF0ZWRfMzM5MV9zdGltdWxhdGlvbl9wbWFpb191bnN0aW1fZG93bnNhbXBsZWRfY2NhX2thbmNob3I1X3NjQ2x1c3RWaXouUkRhdGEiKQojIFNldCBpZGVudGl0eQpJZGVudHMoc2NTZXVyYXQpIDwtICJpbnRlZ3JhdGVkX3Nubl9yZXMuMC40IgpgYGAKClZpZXcgVU1BUAoKYGBge3J9CkRpbVBsb3Qoc2NTZXVyYXQsIGxhYmVsID0gVFJVRSkKYGBgCgpHcmFiIGNsdXN0ZXIgSURzIGFuZCByZXBsYWNlIHdpdGggY2VsbC10eXBlIG5hbWVzCi0gRW5kb3RoZWxpYWwgY2VsbHM6IDAsIDMsIDEwCi0gTWVzZW5jaHltYWwgY2VsbHM6IDgsIDkKLSBIZXBhdG9jeXRlczogNCwgNSwgMTIKLSBUIGNlbGxzOiAyLCA2Ci0gTHltcGhvY3l0ZXM6IDEKLSBQbGFzbWEgY2VsbHM6IDExCkNsdXN0ZXJzIDAsIDQsIDgsIDEwIGhhdmUgb2RkIGdlbmUgZXhwcmVzc2lvbgoKVmlzdWFsaXNlIGdlbmVyYWwgY2VsbC10eXBlIG1hcmtlcnMKCmBgYHtyfQojIEhlcGF0b2N5dGVzCkZlYXR1cmVQbG90KHNjU2V1cmF0LCBmZWF0dXJlcyA9IGMoIkFMQi0xIikpCkZlYXR1cmVQbG90KHNjU2V1cmF0LCBmZWF0dXJlcyA9IGMoIkNZUDJFMSIsIlBDSzEiKSkKIyBFbmRvdGhlbGlhbApGZWF0dXJlUGxvdChzY1NldXJhdCwgZmVhdHVyZXMgPSBjKCJTVEFCMiIsIkNMRUM0RyIpKQpGZWF0dXJlUGxvdChzY1NldXJhdCwgZmVhdHVyZXMgPSBjKCJSU1BPMyIsIk1FQ09NIikpCiMgTHltcGhvY3l0ZXMKRmVhdHVyZVBsb3Qoc2NTZXVyYXQsIGZlYXR1cmVzID0gYygiQ0QzRSIpKQpGZWF0dXJlUGxvdChzY1NldXJhdCwgZmVhdHVyZXMgPSBjKCJYQ0wxO1hDTDIiLCJMRUYxIikpCiMgQiBjZWxscwpGZWF0dXJlUGxvdChzY1NldXJhdCwgZmVhdHVyZXMgPSBjKCJDRDc5QiIsICJNUzRBMSIpKQojIFBsYXNtYSBjZWxscwpGZWF0dXJlUGxvdChzY1NldXJhdCwgZmVhdHVyZXMgPSBjKCJKQ0hBSU4iKSkKIyBNeWVsb2lkIGNlbGxzCkZlYXR1cmVQbG90KHNjU2V1cmF0LCBmZWF0dXJlcyA9IGMoIkxZWi0xIiwiUzEwMEE4IikpCkZlYXR1cmVQbG90KHNjU2V1cmF0LCBmZWF0dXJlcyA9IGMoIkNENUwiLCJDMVFCIikpCkZlYXR1cmVQbG90KHNjU2V1cmF0LCBmZWF0dXJlcyA9IGMoIkNTVDMiLCJGTFQzIikpCiMgQ2hvbGFuZ2lvY3l0ZXMKRmVhdHVyZVBsb3Qoc2NTZXVyYXQsIGZlYXR1cmVzID0gYygiS1JUMTkiLCJTTEM0QTQiKSkKIyBNZXNlbmNoeW1hbApGZWF0dXJlUGxvdChzY1NldXJhdCwgZmVhdHVyZXMgPSBjKCJISElQIikpCmBgYAoKYGBge3J9CmNsdXN0ZXJzIDwtIGFzLmNoYXJhY3RlcihJZGVudHMoc2NTZXVyYXQpKQpjbHVzdGVycyA8LSBnc3ViKCdcXGIwXFxifFxcYjNcXGJ8XFxiMTBcXGInLCAiRW5kb3RoZWxpYWwiLAogICAgICAgICAgICAgICAgIGNsdXN0ZXJzLAogICAgICAgICAgICAgICAgIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGIxXFxiJywgIk15ZWxvaWQiLAogICAgICAgICAgICAgICAgIGNsdXN0ZXJzLAogICAgICAgICAgICAgICAgIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGIyXFxifFxcYjZcXGInLCAiTHltcGhvY3l0ZXMiLAogICAgICAgICAgICAgICAgIGNsdXN0ZXJzLAogICAgICAgICAgICAgICAgIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGIxMVxcYicsICJBbnRpYm9keS1zZWNyZXRpbmcgQiBjZWxscyIsCiAgICAgICAgICAgICAgICAgY2x1c3RlcnMsCiAgICAgICAgICAgICAgICAgcGVybCA9IFRSVUUpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjRcXGJ8XFxiNVxcYnxcXGIxMlxcYicsICJIZXBhdG9jeXRlcyIsCiAgICAgICAgICAgICAgICAgY2x1c3RlcnMsCiAgICAgICAgICAgICAgICAgcGVybCA9IFRSVUUpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjhcXGJ8XFxiOVxcYicsICJNZXNlbmNoeW1hbCIsCiAgICAgICAgICAgICAgICAgY2x1c3RlcnMsCiAgICAgICAgICAgICAgICAgcGVybCA9IFRSVUUpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjdcXGJ8XFxiMTNcXGInLCAiQ2hvbGFuZ2lvY3l0ZXMiLAogICAgICAgICAgICAgICAgIGNsdXN0ZXJzLAogICAgICAgICAgICAgICAgIHBlcmwgPSBUUlVFKQpsZXZlbHMoYXMuZmFjdG9yKGNsdXN0ZXJzKSkKYGBgCgpBZGQgYXMgbWV0YWRhdGEgYW5kIHZpc3VhbGlzZSBvbiBVTUFQCgpgYGB7cn0Kc2NTZXVyYXRAbWV0YS5kYXRhJGdlbmVyYWxfY2VsbF9sYWJlbHMgPC0gY2x1c3RlcnMKRGltUGxvdChzY1NldXJhdCwgZ3JvdXAuYnkgPSAiZ2VuZXJhbF9jZWxsX2xhYmVscyIsIGxhYmVsID0gVFJVRSkKYGBgCgpTYXZlIG9iamVjdCB3aXRoIGxhYmVscyBhZGRlZAoKYGBge3J9CnNhdmUoc0NWZGF0YV9saXN0LCBzY1NldXJhdCwKICAgICBmaWxlID0gIn4vRHJvcGJveC9ab2Uvc2NmX3ZlcnNpb24vYW5hbHlzaXMvaGVhbHRoeV9zYy9zZXVyYXRfb2JqZWN0cy9ub19kcm9wbGV0UUMvMzM5MS9pbnRlZ3JhdGVkXzMzOTFfc3RpbXVsYXRpb25fcG1haW9fdW5zdGltX2Rvd25zYW1wbGVkX2NjYV9rYW5jaG9yNV9zY0NsdXN0Vml6LlJEYXRhIikKYGBgCgpOb3cgYWRkIG5ldyBsYWJlbHMgYnV0IGtlZXAgY2x1c3RlciBudW1iZXJzCgpgYGB7cn0KY2x1c3RlcnMgPC0gYXMuY2hhcmFjdGVyKElkZW50cyhzY1NldXJhdCkpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjBcXGInLCAiRW5kb3RoZWxpYWwgKDApIiwgY2x1c3RlcnMsIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGIzXFxiJywgIkVuZG90aGVsaWFsICgzKSIsIGNsdXN0ZXJzLCBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiMTFcXGInLCAiQW50aWJvZHktc2VjcmV0aW5nIEIgY2VsbHMgKDExKSIsCiAgICAgICAgICAgICAgICAgY2x1c3RlcnMsCiAgICAgICAgICAgICAgICAgcGVybCA9IFRSVUUpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjEyXFxiJywgIkhlcGF0b2N5dGVzICgxMikiLCBjbHVzdGVycywgcGVybCA9IFRSVUUpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjEzXFxiJywgIkNob2xhbmdpb2N5dGVzICgxMykiLCBjbHVzdGVycywgcGVybCA9IFRSVUUpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjEwXFxiJywgIkVuZG90aGVsaWFsICgxMCkiLCBjbHVzdGVycywgcGVybCA9IFRSVUUpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjFcXGInLCAiTXllbG9pZCAoMSkiLCBjbHVzdGVycywgcGVybCA9IFRSVUUpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjJcXGInLCAiQ0QzKyBOSy9UIGNlbGxzICgyKSIsIGNsdXN0ZXJzLCBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiNlxcYicsICJDRDMrIE5LL1QgY2VsbHMgKDYpIiwgY2x1c3RlcnMsIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGI0XFxiJywgIkhlcGF0b2N5dGVzICg0KSIsIGNsdXN0ZXJzLCBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiNVxcYicsICJIZXBhdG9jeXRlcyAoNSkiLCBjbHVzdGVycywgcGVybCA9IFRSVUUpCmNsdXN0ZXJzIDwtIGdzdWIoJ1xcYjhcXGInLCAiTWVzZW5jaHltYWwgKDgpIiwgY2x1c3RlcnMsIHBlcmwgPSBUUlVFKQpjbHVzdGVycyA8LSBnc3ViKCdcXGI5XFxiJywgIk1lc2VuY2h5bWFsICg5KSIsIGNsdXN0ZXJzLCBwZXJsID0gVFJVRSkKY2x1c3RlcnMgPC0gZ3N1YignXFxiN1xcYicsICJDaG9sYW5naW9jeXRlcyAoNykiLCBjbHVzdGVycywgcGVybCA9IFRSVUUpCmxldmVscyhhcy5mYWN0b3IoY2x1c3RlcnMpKQpgYGAKCkFkZCBhcyBtZXRhZGF0YSBhbmQgdmlzdWFsaXNlIG9uIFVNQVAKCmBgYHtyfQpzY1NldXJhdEBtZXRhLmRhdGEkZ2VuZXJhbF9jZWxsX2xhYmVsc19jbHVzdHMgPC0gY2x1c3RlcnMKRGltUGxvdChzY1NldXJhdCwgZ3JvdXAuYnkgPSAiZ2VuZXJhbF9jZWxsX2xhYmVsc19jbHVzdHMiLCBsYWJlbCA9IFRSVUUpCmBgYAoKU2F2ZSBvYmplY3Qgd2l0aCBsYWJlbHMgYWRkZWQKCmBgYHtyfQpzYXZlKHNDVmRhdGFfbGlzdCwgc2NTZXVyYXQsCiAgICAgZmlsZSA9ICJ+L0Ryb3Bib3gvWm9lL3NjZl92ZXJzaW9uL2FuYWx5c2lzL2hlYWx0aHlfc2Mvc2V1cmF0X29iamVjdHMvbm9fZHJvcGxldFFDLzMzOTEvaW50ZWdyYXRlZF8zMzkxX3N0aW11bGF0aW9uX3BtYWlvX3Vuc3RpbV9kb3duc2FtcGxlZF9jY2Ffa2FuY2hvcjVfc2NDbHVzdFZpei5SRGF0YSIpCmBgYAoKCgo=